package main

import (
	"fmt"
	"os"
)

func main() {
	/*
		1.权限：
			（1）权限perm，在创建文件时才需要指定，不需要创建新文件时可以将其设定为0。
					 权限项		字符表示			数字表示		权限分配
					文件类型	  （d|l|c|s|p）
					  读			r			   4		文件所有者
					  写			w			   2		文件所有者
					  执行			x			   1		文件所有者
					  读			r			   4		文件所属组用户
					  写			w			   2		文件所属组用户
					  执行			x			   1		文件所属组用户
					  读			r			   4		其他用户
					  写			w			   2		其他用户
					  执行			x			   1		其他用户

			（2）关于 -rwx rwx rwx:
				- : 代表这是一个普通文件，其中其他文件类型还包括了：
					d ────> 目录文件（directory）
					l ────> 链接文件（link）
					b ────> 块设备文件（block）
					c ────> 字符设备文件（character）
					s ────> 套接字文件（socket）
					p ────> 管道文件（pipe）

				一共有三组 rwx，分别是以下几种用户的 rwx 权限：
				第一组：该文件拥有者的权限
				第二组：该文件拥有者所在组的其他成员对该文件的操作权限
				第三组：其他用户组的成员对该文件的操作权限

			（3）计算权限的值是使用八进制进行计算的
				例如：	-	rwx rwx rwx
						0	111 111 111	（二进制表示）
						0  	 7   7   7
			此时该文件的权限值是 0777，当然还有 0666、0755 等都是这么得来的

			（4）O_RDONLY int=syscall.O_RDONLY//以只读方式打开文件。
				O_WRONLY int=syscall.O_WRONLY//只写打开文件。
				O_RDWR int=syscall.O_RDWR//以读写方式打开文件。
				//剩余的值可以被“或”运算以控制行为。
				O_APPEND int=syscall.O_APPEND//写入时将数据追加到文件中。
				O_CREATE int=syscall.O_CREAT//如果不存在，则创建一个新文件。
				O_EXCL int=syscall.O_EXCL//与O_CREATE一起使用，文件必须不存在。
				O_SYNC int=syscall.O_SYNC//打开以进行同步I/O。
				O_TRUNC int=syscall.O_TRUNC//打开时截断常规可写文件。

		2.目录相关：
			（1）os.Create 函数创建文件
				func Create(name string) (file *File, err error)
				采用模式 0666（任何人都可读写，不可执行）创建一个名为 name 的文件，如果文件已经存在会截断它（为空文件）。
			  	如果成功返回的文件对象可用于 I/O；对应的文件描述符具有 O_RDWR 模式。
				如果出错，错误底层类型是 *PathError。

			（2）创建目录
				1、os.Mkdir 函数创建单个目录
					func Mkdir(name string, perm FileMode) error{}
					只能创建单个目录，不能创建多级目录

				2、os.MkdirAll 函数创建多级目录
					func MkdirAll(path string, perm FileMode) error{}

			（3）删除目录
				1、os.Remove 函数只能删除一个空的目录或一个文件
					func Remove(name string) error{}

				2、os.RemoveAll 函数可以强制删除目录以及目录汇中的文件
					func RemoveAll(path string) error{}

			（4）os.Getwd 函数获得工作目录
				func Getwd() (dir string, err error) {}

			（5）os.Chdir 函数修改工作目录
				func (f *File) Chdir() error {}
				改变工作目录到 f，其中 f 必须为一个目录，否则便会报错。

			（6）os.TempDir 获得临时目录
				func TempDir() string {}

			（7）os.Rename 重命名文件
				func Rename(oldpath, newpath string) error {}

			（8）os.Chmod 函数修改文件权限
				func Chmod(name string, mode FileMode) error {}

			（9）os.Chown 函数修改文件所有者
				func Chown(name string, uid, gid int) error {}

	*/
	fmt.Println("-------------------创建文件------------------------")
	f, err := os.Create("test.txt")
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}
	fmt.Printf("f: %v\n", f) //f: &{0xc000004a00}

	fmt.Println("--------------------创建目录-----------------------")
	err = os.Mkdir("sld", os.ModePerm)
	if err != nil {
		fmt.Println("err:", err)
		return
	}

	err = os.MkdirAll("swk/sxz/n", os.ModePerm)
	if err != nil {
		fmt.Println("err:", err)
		return
	}

	fmt.Println("---------------------删除文件-------------------------")
	err = os.Remove("sld")
	if err != nil {
		fmt.Println("err:", err)
		return
	}

	err = os.RemoveAll("swk")
	if err != nil {
		fmt.Println("err:", err)
		return
	}

	fmt.Println("--------------------获取工作目录---------------------")
	dir, err := os.Getwd()
	if err != nil {
		fmt.Println("err:", err)
		return
	}
	fmt.Println("dir", dir)

	fmt.Println("-------------------修改工作目录----------------------")
	//err = os.Chdir("E:/代码文件/GO/src/go-basic/Go语言标准库/os")
	//if err != nil {
	//	fmt.Println("err:",err)
	//	return
	//}
	//fmt.Println(os.Getwd())

	fmt.Println("-------------------获得临时目录-----------------------")

	s := os.TempDir()
	fmt.Println("s:", s) //s: D:\Tmp\Temp\Temp

	fmt.Println("--------------------重命名文件-------------------------")
	err = os.Rename("test.txt", "test2.txt")
	if err != nil {
		fmt.Println("err:", err)
		return
	}

}
